package testes;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

import usuarios.*;

import exceptions.BairroInvalidoException;
import exceptions.CEPInvalidoException;
import exceptions.LogradouroInvalidoException;
import exceptions.NumeroInvalidoException;


public class EnderecoTest {
	Endereco e1;
	Endereco e2;
	Endereco e3;

	@Before
	public void setUp() throws Exception {
		e1 = new Endereco("Praca Clementino Procopio", "144", "Centro",
				"69100-103", true);
		e2 = new Endereco("R. Denisio Souza", "444", "Alto Branco",
				"69440-133", false);
	}

	@Test
	public void testEndereco() throws NumeroInvalidoException,
			BairroInvalidoException, CEPInvalidoException,
			LogradouroInvalidoException {

		// TESTE DE LOGRADOURO

		try {
			e3 = new Endereco("", "333", "Alto Branco", "42120-133", false);
			System.out.println("Deveria ter lancado excecao.");
		} catch (LogradouroInvalidoException e) {
			Assert.assertEquals("O logradouro nao pode ser nulo e deve "
					+ "ser formado por caracteres", e.getMessage());
		}

		try {
			e3 = new Endereco(null, "333", "Alto Branco", "42120-133", false);
			System.out.println("Deveria ter lancado excecao.");
		} catch (LogradouroInvalidoException e) {
			Assert.assertEquals("O logradouro nao pode ser nulo e deve "
					+ "ser formado por caracteres", e.getMessage());
		}

		try {
			e3 = new Endereco("R. Denisio Souza", "333", "Alto Branco",
					"42120-133", false);
		} catch (LogradouroInvalidoException e) {
			System.out.println("Nao ira aparecer esta mensagem, "
					+ "pois nao lancou excecao");
		}

		// TESTE DE NÚMERO
		
		try {
			e3 = new Endereco("R. Denisio Souza", "333dddd", "Alto Branco",
					"42120-133", false);
			System.out.println("Deveria ter lancado excecao.");
		} catch (NumeroInvalidoException e) {
			Assert.assertEquals("O numero nao pode ser nulo e deve ser formado"
					+ " por digitos ou inicialmente por digitos"
					+ " e finalizado com uma letra", e.getMessage());
		}

		try {
			e3 = new Endereco("R. Denisio Souza", "333dd", "Alto Branco",
					"42120-133", false);
			System.out.println("Deveria ter lancado excecao.");
		} catch (NumeroInvalidoException e) {
			Assert.assertEquals("O numero nao pode ser nulo e deve ser formado"
					+ " por digitos ou inicialmente por digitos"
					+ " e finalizado com uma letra", e.getMessage());
		}

		try {
			e3 = new Endereco("R. Denisio Souza", "333dd", "Alto Branco",
					"42120-133", false);
			System.out.println("Deveria ter lancado excecao.");
		} catch (NumeroInvalidoException e) {
			Assert.assertEquals("O numero nao pode ser nulo e deve ser formado"
					+ " por digitos ou inicialmente por digitos"
					+ " e finalizado com uma letra", e.getMessage());
		}

		try {
			e3 = new Endereco("R. Denisio Souza", "", "Alto Branco",
					"42120-133", false);
			System.out.println("Deveria ter lancado excecao.");
		} catch (NumeroInvalidoException e) {
			Assert.assertEquals("O numero nao pode ser nulo e deve ser formado"
					+ " por digitos ou inicialmente por digitos"
					+ " e finalizado com uma letra", e.getMessage());
		}

		try {
			e3 = new Endereco("R. Denisio Souza", null, "Alto Branco",
					"42120-133", false);
			System.out.println("Deveria ter lancado excecao.");
		} catch (NumeroInvalidoException e) {
			Assert.assertEquals("O numero nao pode ser nulo e deve ser formado"
					+ " por digitos ou inicialmente por digitos"
					+ " e finalizado com uma letra", e.getMessage());
		}

		try {
			e3 = new Endereco("R. Denisio Souza", "A333", "Alto Branco",
					"42120-133", false);
			System.out.println("Deveria ter lancado excecao.");
		} catch (NumeroInvalidoException e) {
			Assert.assertEquals("O numero nao pode ser nulo e deve ser formado"
					+ " por digitos ou inicialmente por digitos"
					+ " e finalizado com uma letra", e.getMessage());
		}

		try {
			e3 = new Endereco("R. Denisio Souza", "333A", "Alto Branco",
					"42120-133", false);
		} catch (NumeroInvalidoException e) {
			System.out.println("Nao ira aparecer esta mensagem, pois"
					+ "nao lancou excecao");
		}

		try {
			e3 = new Endereco("R. Denisio Souza", "333", "Alto Branco",
					"42120-133", false);
		} catch (NumeroInvalidoException e) {
			System.out.println("Nao ira aparecer esta mensagem, pois"
					+ "nao lancou excecao");
		}

		// TESTE DE BAIRRO
		
		try {
			e3 = new Endereco("R. Denisio Souza", "333", "", "42120-133", false);
			System.out.println("Deveria ter lancado excecao.");
		} catch (BairroInvalidoException e) {
			Assert.assertEquals("O bairro nao pode ser nulo e "
					+ "deve ser formado por caracteres.", e.getMessage());
		}

		try {
			e3 = new Endereco("R. Denisio Souza", "333", null, "42120-133",
					false);
			System.out.println("Deveria ter lancado excecao.");
		} catch (BairroInvalidoException e) {
			Assert.assertEquals("O bairro nao pode ser nulo e "
					+ "deve ser formado por caracteres.", e.getMessage());
		}

		try {
			e3 = new Endereco("R. Denisio Souza", "333", "Alto Branco",
					"42120-133", false);
		} catch (BairroInvalidoException e) {
			System.out.println("Nao ira aparecer esta mensagem, "
					+ "pois nao lancou excecao");
		}

		// TESTE DE CEP		
		try {
			e3 = new Endereco("R. Denisio Souza", "333", "Alto Branco",
					"42120-13", false);
			System.out.println("Deveria ter lancado excecao.");
		} catch (CEPInvalidoException e) {
			Assert.assertEquals("O CEP nao pode ser nulo e deve ser formado "
					+ "por 7 digitos ou 7 digitos com um hifen "
					+ "apos o quarto digito.", e.getMessage());
		}

		try {
			e3 = new Endereco("R. Denisio Souza", "333", "Alto Branco",
					"4212013", false);
			System.out.println("Deveria ter lancado excecao.");
		} catch (CEPInvalidoException e) {
			Assert.assertEquals("O CEP nao pode ser nulo e deve ser formado "
					+ "por 7 digitos ou 7 digitos com um hifen "
					+ "apos o quarto digito.", e.getMessage());
		}

		try {
			e3 = new Endereco("R. Denisio Souza", "333", "Alto Branco",
					"4212-113", false);
			System.out.println("Deveria ter lancado excecao.");
		} catch (CEPInvalidoException e) {
			Assert.assertEquals("O CEP nao pode ser nulo e deve ser formado "
					+ "por 7 digitos ou 7 digitos com um hifen "
					+ "apos o quarto digito.", e.getMessage());
		}

		try {
			e3 = new Endereco("R. Denisio Souza", "333", "Alto Branco", "",
					false);
			System.out.println("Deveria ter lancado excecao.");
		} catch (CEPInvalidoException e) {
			Assert.assertEquals("O CEP nao pode ser nulo e deve ser formado "
					+ "por 7 digitos ou 7 digitos com um hifen "
					+ "apos o quarto digito.", e.getMessage());
		}

		try {
			e3 = new Endereco("R. Denisio Souza", "333", "Alto Branco", null,
					false);
			System.out.println("Deveria ter lancado excecao.");
		} catch (CEPInvalidoException e) {
			Assert.assertEquals("O CEP nao pode ser nulo e deve ser formado "
					+ "por 7 digitos ou 7 digitos com um hifen "
					+ "apos o quarto digito.", e.getMessage());
		}

		try {
			e3 = new Endereco("R. Denisio Souza", "333", "Alto Branco",
					"55555-555", false);
		} catch (CEPInvalidoException e) {
			System.out.println("Nao ira aparecer esta mensagem, pois"
					+ "nao lancou excecao.");
		}

		try {
			e3 = new Endereco("R. Denisio Souza", "333", "Alto Branco",
					"55555555", false);
		} catch (CEPInvalidoException e) {
			System.out.println("Nao ira aparecer esta mensagem, pois"
					+ "nao lancou excecao.");
		}
	}

	/**
	 * Testa o get de Logradouro.
	 */
	
	@Test
	public void testGetLogradouro() {
		Assert.assertEquals("Praca Clementino Procopio", e1.getLogradouro());
		Assert.assertEquals("R. Denisio Souza", e2.getLogradouro());
	}

	/**
	 * Testa o set de Logradouro.
	 */
	
	@Test
	public void testSetLogradouro() {
		e1.setLogradouro("R. Denisio Souza");
		e2.setLogradouro("Praca Clementino Procopio");
		Assert.assertEquals("R. Denisio Souza", e1.getLogradouro());
		Assert.assertEquals("Praca Clementino Procopio", e2.getLogradouro());
	}

	/**
	 * Testa o get de Numero.
	 */
	
	@Test
	public void testGetNumero() {
		Assert.assertEquals("144", e1.getNumero());
		Assert.assertEquals("444", e2.getNumero());
	}

	/**
	 * Testa o set de Numero.
	 */
	
	@Test
	public void testSetNumero() {
		e1.setNumero("444");
		e2.setNumero("144");
		Assert.assertEquals("444", e1.getNumero());
		Assert.assertEquals("144", e2.getNumero());
	}

	/**
	 * Testa o get de Bairro.
	 */
	
	@Test
	public void testGetBairro() {
		Assert.assertEquals("Centro", e1.getBairro());
		Assert.assertEquals("Alto Branco", e2.getBairro());
	}

	/**
	 * Testa o set de Bairro.
	 */
	
	@Test
	public void testSetBairro() {
		e1.setBairro("Alto Branco");
		e2.setBairro("Centro");
		Assert.assertEquals("Alto Branco", e1.getBairro());
		Assert.assertEquals("Centro", e2.getBairro());
	}

	/**
	 * Testa o get de CEP.
	 */
	
	@Test
	public void testGetCep() {
		Assert.assertEquals("69100-103", e1.getCep());
		Assert.assertEquals("69440-133", e2.getCep());
	}

	/**
	 * Testa o set de CEP.
	 */
	
	@Test
	public void testSetCep() {
		e1.setCep("69440-133");
		e2.setCep("69100-103");
		Assert.assertEquals("69440-133", e1.getCep());
		Assert.assertEquals("69100-103", e2.getCep());
	}

	/**
	 * Testa se o endereco eh principal.
	 */
	
	@Test
	public void testIsPrincipal() {
		Assert.assertEquals(true, e1.isPrincipal());
		Assert.assertEquals(false, e2.isPrincipal());
	}

	/**
	 * Testa o set de Principal.
	 */
	
	@Test
	public void testSetPrincipal() {
		e1.setPrincipal(false);
		e2.setPrincipal(true);
		Assert.assertEquals(false, e1.isPrincipal());
		Assert.assertEquals(true, e2.isPrincipal());
	}
}